//  权限拦截  导航守卫 路由守卫  router
import router from "@/router"; // 引入路由实例
import store from "@/store"; //  引入 vuex store 实例
// 导入 store 是因为在路由里面  无法直接使用 this.$store
// 因为路由中 this 和 Vue 实例没有任何关系
//  在 vue 组件中  this.$store === store  因为 vuex 向外暴露的就是这个 store
import NProgress from "nprogress"; // 引入一份进度条插件
import "nprogress/nprogress.css"; // 引入进度条样式

const whiteList = ["/login", "/404"]; // 定义白名单  所有不受权限控制的页面

// 路由的前置守卫   to  要去的     from   从哪里来     next  路由跳转
router.beforeEach(async (to, from, next) => {
  NProgress.start(); // 开启进度条
  // 首先判断有无 token
  if (store.getters.token) {
    // 如果有 token  继续判断是不是去登录页面
    if (to.path === "/login") {
      // 表示去的是登录页
      next("/"); // 跳到主页
    } else {
      // 只有放过的时候才去获取用户资料
      // 不是每次都获取
      // 如果当前 vuex 中有用户的资料的 id 表示已经有资料了，不需要再获取了 如果没有 id 才需要获取资料
      // if (!store.state.user.userInfo.userId) {
      //   // 如果没有 id 表示当前用户资料没有获取过
      //   await store.dispatch("user/getUserInfo");
      // }
      if (!store.getters.userId) {
        // async 函数所 return 的内容 用 await 就可以接收到
        const { roles } = await store.dispatch("user/getUserInfo");
        // 为什么要写 await 因为要获取完资料再去放行  相当于改成同步
        // 筛选用户路由
        // actions 中函数默认是 Premise 对象 调用这个对象 想要获取返回值的的话 必须家 await 或者是 then
        // actions 是做异步操作的
        const routes = await store.dispatch(
          "permission/filterRoutes",
          roles.menus
        );
        // console.log(roles.menus, "--------------------");
        // routes 就是筛选到的动态路由
        // 动态路由 添加到 路由表中 默认的路由只有静态路由 没有动态路由
        // addRoutes 必须用 next(地址)  不能应 next()
        // router.addRoutes(routes); // 添加动态路到路由表  铺路
        //  router.addRoutes   异步执行 一旦刷新 动态路由会重新添加 await 后面只能是 promise
        router.addRoutes([
          ...routes,
          { path: "*", redirect: "/404", hidden: true }
        ]);
        // 添加完动态路由之后
        next(to.path); // 相当于跳到对应的地址 相当于多做一次跳转
      } else {
        next(); // 直接放行
      }
    }
  } else {
    // 如果没有 token  判断是否在白名单里
    if (whiteList.indexOf(to.path) > -1) {
      // 如果找到了 表示在白名单里 直接放行
      next();
    } else {
      // 没有 token  也不在白名单里
      next("/login"); // 跳转到登录页面
    }
  }
  NProgress.done(); // 手动强制关闭一次  为了解决 手动切换地址时  进度条不关闭的问题
});

// 后置守卫
router.afterEach(function() {
  NProgress.done(); // 关闭进度条
});
